D			[0-9]
L			[a-zA-Z_]
H			[a-fA-F0-9]
E			[Ee][+-]?{D}+
FS			(f|F|l|L)
IS			(u|U|l|L)*
%{
#include<stdlib.h>
#include<ctype.h>
#include<stdio.h>
#include"scanner.tab.h"
%}
%%
"if" {printf("<  %s,  保留字> ", yytext);return IF;} 
"while" {printf("<  %s,  保留字> ", yytext);return WHILE;} 
"do" {printf("<  %s,  保留字> ", yytext);return DO;} 
"main" {printf("<  %s,  保留字> ", yytext);return MAIN;}
"void" {printf("<  %s,  保留字> ", yytext);return VOID;}
"break" {printf("<  %s,  保留字> ", yytext);return BREAK;}
"int"|"float"|"bool"|"char" {printf("<  %s,  保留字> ", yytext);return BASIC;}
"true" {printf("<  %s,  保留字> ", yytext);return TRUE;}
"false" {printf("<  %s,  保留字> ", yytext);return FALSE;}
"else"  {printf("<  %s,  保留字> ", yytext);return ELSE;}
"return" {printf("<  %s,  保留字> ", yytext);return RETURN;}
[a-zA-Z_][a-zA-Z_0-9]* { printf("<  %s,  标识符> ", yytext);return ID;}
({D}*"."{D}+({E})?{FS}?)|({D}+"."{D}*({E})?{FS}?) {printf("<  %s, 常数 > ", yytext);return REAL;}
(0[xX]{H}+{IS}?)|(0{D}+{IS}?)|({D}+{IS}?)|(L?'(\\.|[^\\'])+')|({D}+{E}{FS}?) {printf("<  %s, 常数 >  ", yytext);return NUM;}
"||" {printf("<  %s, 操作符 >  ", yytext);return OR;}
"&&" {printf("<  %s, 操作符 >  ", yytext);return AND;}
"|" {printf("<  %s, 操作符 >  ", yytext);return '|';}
"&" {printf("<  %s, 操作符 >  ", yytext);return '&';}
"<=" {printf("<  %s, 操作符 >  ", yytext);return LE;}
"<" { printf("<  %s, 操作符 >  ", yytext);return '<';}
">=" {printf("<  %s, 操作符 >  ", yytext);return GE;}
">" {printf("<  %s, 操作符 >  ", yytext);return '>';}
"!=" {printf("<  %s, 操作符 >  ", yytext);return NE;}
"=" {printf("<  %s, 操作符 >  ", yytext); return '=';}
"==" {printf("<  %s, 操作符 >  ", yytext);return EQ;}
"\+"  {printf("<  %s, 操作符 >  ", yytext);return '+';}
"++" {printf("<  %s, 操作符 >  ", yytext);return ADD2;}
"--" {printf("<  %s, 操作符 >  ", yytext);return SUB2;}
"\-" {printf("<  %s, 操作符 >  ", yytext);return '-';}
"\*" {printf("<  %s, 操作符 >  ", yytext);return '*';}
"\/" {printf("<  %s, 操作符 >  ", yytext);return '/';}
"(" {printf("<  %s, 界符 >  ", yytext);return '(';}
")" {printf("<  %s, 界符 >  ", yytext);return ')';}
";" {printf("<  %s, 界符 >  ", yytext);return ';';}
"{" {printf("<  %s, 界符 >  ", yytext);return '{';}
"}" {printf("<  %s, 界符 >  ", yytext);return '}';}
"[" {printf("<  %s, 界符 >  ", yytext);return '['; }
"]" {printf("<  %s, 界符 >  ", yytext);return ']';}
"//".*  {}
[ \n\t] {}
%%

int yywrap(void){
	return 1;// 只处理一个输入文件
}

